/*
Component:worker and socket - socket
author:lhm
time:2017.07.18
 */
var socketObj;
var address = null;// = "ws://10.1.21.134:12345";

var reConnectFlag = true;	//是否断线重连
var connectState = false;	//连接状态(用于判断定时器操作是否合法)

var updateFlag = false;		//未开启队列模式
var timeoutObj;

var allow_send = true;
var no_response_count = 0;

//队列结构
function Queue() {
    this.dataStore = [];
    this.enqueue = enqueue;
    this.dequeue = dequeue;
    this.queueFront = queueFront;
    this.queueBack = queueBack;
    this.queueToString = queueToString;
    this.queueEmpty = queueEmpty;
    this.queueClear = queueClear;
}

//向队末尾添加一个元素
function enqueue(element) {
    this.dataStore.push(element)
}

//删除队首的元素
function dequeue() {
    return this.dataStore.shift();
}

function queueFront() { //读取队首的元素
    return this.dataStore[0];
}
function queueBack() { ////读取队末的元素
    return this.dataStore[this.dataStore.length - 1]
}

//显示队列内的所有元素
function queueToString() {
    var retStr = "";
    for (var i = 0; i < this.dataStore.length; ++i ) {
        retStr += this.dataStore[i] + "\n";
    }
    return retStr
}

//队列是否为空
function queueEmpty() {
    if (this.dataStore.length == 0) {
		return true;
    }
    else {
        return false;
	}
}

function queueClear() {
	if (this.dataStore.length != 0) {
		console.log("queue old length : " + this.dataStore.length);
		this.dataStore.splice(0,this.dataStore.length);//清空队列
	}
}

var qObj = new Queue();//声明全局

//测试程序 队列
// var q = new Queue();
// q.enqueue("Me");
// q.enqueue("Her");
// q.enqueue("His");
// console.log(q.toString()); 
// q.dequeue();
// console.log(q.toString());

// console.log("第一个元素是： " + q.front());
// console.log("最后一个元素是： " + q.back())

/*通信部分*/
//接收来自main的指令
onmessage = function(event) {
	//console.log("from main hmi msg :" + event.data);
	if(address)
	{
		if(event.data == "init")
		{
			reConnectFlag = true;//开启断线重连
			initWebSocket();
		}
		else if(event.data == "close")
		{
			reConnectFlag = false;//关闭断线重连
			socketObj.close();
			socketObj = null;
		}
		else if(event.data == "queue")
		{
			timeoutUpdate();//启动队列管理器
		}
		else//其他指令
		{
			if(socketObj){
				if(updateFlag){//已经队列模式
					qObj.enqueue(event.data);//加入队列
				}
				else{
					socketObj.send(event.data);//没有开启队列时候,直接发送
				}
			}
		}
	}
	else
	{
		//未获取ip值
		//正则匹配 是否ip 若是ip 获取
		address = event.data;
	}
}

function initWebSocket() {
	allow_send = true;


	if(!socketObj)
	{
		socketObj = new WebSocket(address);
		//连接成功建立后响应
		socketObj.onopen = function() {
			clearAllOfQueue();			//初始化队列使用状态

			connectState = true;
		    postMessage("connect_:open");//返回
		}

		//收到服务器消息后响应
		socketObj.onmessage = function(e) {
		    postMessage(e.data);//直接返回上层即可
		    allow_send = true;
		}

		//连接关闭后响应
		socketObj.onclose = function() {
			connectState = false;
		    postMessage("connect_:close");//返回
		    socketObj = null;

		    if(reConnectFlag){
		    	initWebSocket();
		    }
		}
	}
}

var countRe = 0;
function timeoutUpdate()//这部分以后考虑根据页面去刷新 减少刷新量
{
	if(updateFlag){//已开启
		//关闭
		console.log("close loop of queue");
		console.log("send count : " + countRe);//发送统计
		
		clearInterval(timeoutObj);
		
		//清空
		updateFlag = false;

		clearAllOfQueue();
	}
	else{
		//开启
		console.log("start loop of queue");
		timeoutObj = setInterval(function(){
			if (socketObj && connectState) {			//在连接正常的状态下
				//socketObj.send("getState:");
				if(allow_send){							//必须当前允许发送
					if(!qObj.queueEmpty()){				//非空
						allow_send = false;

						socketObj.send(qObj.queueFront());		//队列头部的发送
						qObj.dequeue();							//删除队列头部

						no_response_count = 0;
						countRe++;
						// console.log("send count : " + countRe);//发送统计
						
						//定期打印发送成功发送的次数  并且清除一次队列，打印多少没有发出去
						if(countRe%5000 == 0){console.log("************* send count : " + countRe);}

					}
				}
				else{
					no_response_count++;
					//console.log("wait response : " + no_response_count);//发送统计
					if(countRe%5000 == 0){console.log("************* no_response_count : " + no_response_count);}
				}
			}
		},100);
		
		updateFlag = true;
	}
}

// 清空关于队列的所有东西 重新初始化状态
function clearAllOfQueue(){
	console.log("****************************** clear the queue");
	qObj.queueClear();		//清空队列内容

	countRe = 0;			//清空 发送计数
	no_response_count = 0;	//清空 等待计数
	allow_send = true;		//重新允许队列进入
}

// 超时判断已经添加 但对应如何处理还没有
// 如果队列越来越多怎么办
// 寸动怎么解决 也要队列？临时队列？
